Completed
Push — master ( e88c19...17669b )
by Rain
03:00
created

MessageUserStore.setMessage   F

Complexity

Conditions 48
Paths > 20000

Size

Total Lines 211

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 48
c 0
b 0
f 0
nc 186724
nop 2
dl 0
loc 211
rs 2

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

Complexity

Complex classes like MessageUserStore.setMessage often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
2
import window from 'window';
3
import _ from '_';
4
import ko from 'ko';
5
import $ from '$';
6
7
import {
8
	Magics, Layout, Focused,
9
	MessageSetAction,
10
	StorageResultType,
11
	Notification
12
} from 'Common/Enums';
13
14
import {
15
	trim, isNormal, isArray, inArray,
16
	pInt, pString, plainToHtml,
17
	windowResize, findEmailAndLinks
18
} from 'Common/Utils';
19
20
import {
21
	getFolderInboxName,
22
	addNewMessageCache,
23
	setFolderUidNext,
24
	getFolderFromCacheList,
25
	setFolderHash,
26
	initMessageFlagsFromCache,
27
	addRequestedMessage,
28
	clearMessageFlagsFromCacheByFolder,
29
	hasNewMessageAndRemoveFromCache,
30
	storeMessageFlagsToCache,
31
	clearNewMessageCache
32
} from 'Common/Cache';
33
34
import {MESSAGE_BODY_CACHE_LIMIT} from 'Common/Consts';
35
import {data as GlobalsData, $div} from 'Common/Globals';
36
import {mailBox, notificationMailIcon} from 'Common/Links';
37
import {i18n, getNotification} from 'Common/Translator';
38
39
import * as MessageHelper from 'Helper/Message';
40
import {MessageModel} from 'Model/Message';
41
42
import {setHash} from 'Knoin/Knoin';
43
44
import AppStore from 'Stores/User/App';
45
import FolderStore from 'Stores/User/Folder';
46
import PgpStore from 'Stores/User/Pgp';
47
import SettingsStore from 'Stores/User/Settings';
48
49
import {getApp} from 'Helper/Apps/User';
50
51
import Remote from 'Remote/User/Ajax';
52
53
class MessageUserStore
54
{
55
	constructor()
56
	{
57
		this.staticMessage = new MessageModel();
58
59
		this.messageList = ko.observableArray([]).extend({rateLimit: 0});
60
61
		this.messageListCount = ko.observable(0);
62
		this.messageListSearch = ko.observable('');
63
		this.messageListThreadUid = ko.observable('');
64
		this.messageListPage = ko.observable(1);
65
		this.messageListPageBeforeThread = ko.observable(1);
66
		this.messageListError = ko.observable('');
67
68
		this.messageListEndFolder = ko.observable('');
69
		this.messageListEndSearch = ko.observable('');
70
		this.messageListEndThreadUid = ko.observable('');
71
		this.messageListEndPage = ko.observable(1);
72
73
		this.messageListLoading = ko.observable(false);
74
		this.messageListIsNotCompleted = ko.observable(false);
75
		this.messageListCompleteLoadingThrottle = ko.observable(false).extend({throttle: 200});
76
		this.messageListCompleteLoadingThrottleForAnimation = ko.observable(false).extend({specialThrottle: 700});
77
78
		this.messageListDisableAutoSelect = ko.observable(false).extend({falseTimeout: 500});
79
80
		this.selectorMessageSelected = ko.observable(null);
81
		this.selectorMessageFocused = ko.observable(null);
82
83
		// message viewer
84
		this.message = ko.observable(null);
85
86
		this.message.viewTrigger = ko.observable(false);
87
88
		this.messageError = ko.observable('');
89
90
		this.messageCurrentLoading = ko.observable(false);
91
92
		this.messageLoadingThrottle = ko.observable(false).extend({throttle: Magics.Time50ms});
93
94
		this.messageFullScreenMode = ko.observable(false);
95
96
		this.messagesBodiesDom = ko.observable(null);
97
		this.messageActiveDom = ko.observable(null);
98
99
		this.computers();
100
		this.subscribers();
101
102
		this.onMessageResponse = _.bind(this.onMessageResponse, this);
103
104
		this.purgeMessageBodyCacheThrottle = _.throttle(this.purgeMessageBodyCache, Magics.Time30s);
105
	}
106
107
	computers() {
108
109
		this.messageLoading = ko.computed(() => this.messageCurrentLoading());
110
111
		this.messageListEndHash = ko.computed(
112
			() => this.messageListEndFolder() + '|' + this.messageListEndSearch() +
113
				'|' + this.messageListEndThreadUid() + '|' + this.messageListEndPage()
114
		);
115
116
		this.messageListPageCount = ko.computed(() => {
117
			const page = window.Math.ceil(this.messageListCount() / SettingsStore.messagesPerPage());
118
			return 0 >= page ? 1 : page;
119
		});
120
121
		this.mainMessageListSearch = ko.computed({
122
			read: this.messageListSearch,
123
			write: (value) => {
124
				setHash(
125
					mailBox(FolderStore.currentFolderFullNameHash(), 1, trim(value.toString()), this.messageListThreadUid())
126
				);
127
			}
128
		});
129
130
		this.messageListCompleteLoading = ko.computed(() => {
131
			const
132
				one = this.messageListLoading(),
133
				two = this.messageListIsNotCompleted();
134
			return one || two;
135
		});
136
137
		this.isMessageSelected = ko.computed(() => null !== this.message());
138
139
		this.messageListChecked = ko.computed(
140
			() => _.filter(this.messageList(), (item) => item.checked())
141
		).extend({rateLimit: 0});
142
143
		this.hasCheckedMessages = ko.computed(() => 0 < this.messageListChecked().length).extend({rateLimit: 0});
144
145
		this.messageListCheckedOrSelected = ko.computed(() => {
146
			const
147
				checked = this.messageListChecked(),
148
				selectedMessage = this.selectorMessageSelected();
149
			return _.union(checked, selectedMessage ? [selectedMessage] : []);
150
		});
151
152
		this.messageListCheckedOrSelectedUidsWithSubMails = ko.computed(() => {
153
			let result = [];
154
			_.each(this.messageListCheckedOrSelected(), (message) => {
155
				if (message)
156
				{
157
					result.push(message.uid);
158
					if (1 < message.threadsLen())
159
					{
160
						result = _.union(result, message.threads());
161
					}
162
				}
163
			});
164
			return result;
165
		});
166
	}
167
168
	subscribers() {
169
170
		this.messageListCompleteLoading.subscribe((value) => {
171
			value = !!value;
172
			this.messageListCompleteLoadingThrottle(value);
173
			this.messageListCompleteLoadingThrottleForAnimation(value);
174
		});
175
176
		this.messageList.subscribe(_.debounce((list) => {
177
			_.each(list, (item) => {
178
				if (item && item.newForAnimation())
179
				{
180
					item.newForAnimation(false);
181
				}
182
			});
183
		}, Magics.Time500ms));
184
185
		this.message.subscribe((message) => {
186
187
			if (message)
188
			{
189
				if (Layout.NoPreview === SettingsStore.layout())
190
				{
191
					AppStore.focusedState(Focused.MessageView);
192
				}
193
			}
194
			else
195
			{
196
				AppStore.focusedState(Focused.MessageList);
197
198
				this.messageFullScreenMode(false);
199
				this.hideMessageBodies();
200
			}
201
202
		});
203
204
		this.messageLoading.subscribe((value) => {
205
			this.messageLoadingThrottle(value);
206
		});
207
208
		this.messagesBodiesDom.subscribe((dom) => {
209
			if (dom && !(dom instanceof $))
210
			{
211
				this.messagesBodiesDom($(dom));
212
			}
213
		});
214
215
		this.messageListEndFolder.subscribe((folder) => {
216
			const message = this.message();
217
			if (message && folder && folder !== message.folderFullNameRaw)
218
			{
219
				this.message(null);
220
			}
221
		});
222
	}
223
224
	purgeMessageBodyCache() {
225
226
		let count = 0;
227
		const end = GlobalsData.iMessageBodyCacheCount - MESSAGE_BODY_CACHE_LIMIT;
228
229
		if (0 < end)
230
		{
231
			const messagesDom = this.messagesBodiesDom();
232
			if (messagesDom)
233
			{
234
				messagesDom.find('.rl-cache-class').each(function() {
235
					const item = $(this); // eslint-disable-line no-invalid-this
236
					if (end > item.data('rl-cache-count'))
237
					{
238
						item.addClass('rl-cache-purge');
239
						count += 1;
240
					}
241
				});
242
243
				if (0 < count)
244
				{
245
					_.delay(() => messagesDom.find('.rl-cache-purge').remove(), Magics.Time350ms);
246
				}
247
			}
248
		}
249
	}
250
251
	initUidNextAndNewMessages(folder, uidNext, newMessages) {
252
		if (getFolderInboxName() === folder && isNormal(uidNext) && '' !== uidNext)
253
		{
254
			if (isArray(newMessages) && 0 < newMessages.length)
255
			{
256
				const
257
					len = newMessages.length,
258
					NotificationStore = require('Stores/User/Notification');
259
260
				_.each(newMessages, (item) => {
261
					addNewMessageCache(folder, item.Uid);
262
				});
263
264
				NotificationStore.playSoundNotification();
265
266
				if (3 < len)
267
				{
268
					NotificationStore.displayDesktopNotification(
269
						notificationMailIcon(),
270
						require('Stores/User/Account').email(),
271
						i18n('MESSAGE_LIST/NEW_MESSAGE_NOTIFICATION', {
272
							'COUNT': len
273
						}),
274
						{'Folder': '', 'Uid': ''}
275
					);
276
				}
277
				else
278
				{
279
					_.each(newMessages, (item) => {
280
						NotificationStore.displayDesktopNotification(
281
							notificationMailIcon(),
282
							MessageHelper.emailArrayToString(MessageHelper.emailArrayFromJson(item.From), false),
283
							item.Subject,
284
							{'Folder': item.Folder, 'Uid': item.Uid}
285
						);
286
					});
287
				}
288
			}
289
290
			setFolderUidNext(folder, uidNext);
291
		}
292
	}
293
294
	hideMessageBodies() {
295
		const messagesDom = this.messagesBodiesDom();
296
		if (messagesDom)
297
		{
298
			messagesDom.find('.b-text-part').hide();
299
		}
300
	}
301
302
	/**
303
	 * @param {string} fromFolderFullNameRaw
304
	 * @param {Array} uidForRemove
305
	 * @param {string=} toFolderFullNameRaw = ''
306
	 * @param {boolean=} bCocopypy = false
0 ignored issues
show
Documentation introduced by
The parameter bCocopypy does not exist. Did you maybe forget to remove this comment?
Loading history...
307
	 */
308
	removeMessagesFromList(fromFolderFullNameRaw, uidForRemove, toFolderFullNameRaw = '', copy = false) {
309
310
		uidForRemove = _.map(uidForRemove, (mValue) => pInt(mValue));
311
312
		let
313
			unseenCount = 0,
314
			messageList = this.messageList(),
315
			currentMessage = this.message();
316
317
		const
318
			trashFolder = FolderStore.trashFolder(),
319
			spamFolder = FolderStore.spamFolder(),
320
			fromFolder = getFolderFromCacheList(fromFolderFullNameRaw),
321
			toFolder = '' === toFolderFullNameRaw ? null : getFolderFromCacheList(toFolderFullNameRaw || ''),
322
			currentFolderFullNameRaw = FolderStore.currentFolderFullNameRaw(),
323
			messages = currentFolderFullNameRaw === fromFolderFullNameRaw ?
324
				_.filter(messageList, (item) => (item && -1 < inArray(pInt(item.uid), uidForRemove))) : [];
325
326
		_.each(messages, (item) => {
327
			if (item && item.unseen())
328
			{
329
				unseenCount += 1;
330
			}
331
		});
332
333
		if (fromFolder && !copy)
334
		{
335
			fromFolder.messageCountAll(0 <= fromFolder.messageCountAll() - uidForRemove.length ?
336
				fromFolder.messageCountAll() - uidForRemove.length : 0);
337
338
			if (0 < unseenCount)
339
			{
340
				fromFolder.messageCountUnread(0 <= fromFolder.messageCountUnread() - unseenCount ?
341
					fromFolder.messageCountUnread() - unseenCount : 0);
342
			}
343
		}
344
345
		if (toFolder)
346
		{
347
			if (trashFolder === toFolder.fullNameRaw || spamFolder === toFolder.fullNameRaw)
348
			{
349
				unseenCount = 0;
350
			}
351
352
			toFolder.messageCountAll(toFolder.messageCountAll() + uidForRemove.length);
353
			if (0 < unseenCount)
354
			{
355
				toFolder.messageCountUnread(toFolder.messageCountUnread() + unseenCount);
356
			}
357
358
			toFolder.actionBlink(true);
359
		}
360
361
		if (0 < messages.length)
362
		{
363
			if (copy)
364
			{
365
				_.each(messages, (item) => {
366
					item.checked(false);
367
				});
368
			}
369
			else
370
			{
371
				this.messageListIsNotCompleted(true);
372
373
				_.each(messages, (item) => {
374
					if (currentMessage && currentMessage.hash === item.hash)
375
					{
376
						currentMessage = null;
377
						this.message(null);
378
					}
379
380
					item.deleted(true);
381
				});
382
383
				_.delay(() => {
384
					_.each(messages, (item) => {
385
						this.messageList.remove(item);
386
					});
387
				}, Magics.Time350ms);
388
			}
389
		}
390
391
		if ('' !== fromFolderFullNameRaw)
392
		{
393
			setFolderHash(fromFolderFullNameRaw, '');
394
		}
395
396
		if ('' !== toFolderFullNameRaw)
397
		{
398
			setFolderHash(toFolderFullNameRaw, '');
399
		}
400
401
		if ('' !== this.messageListThreadUid())
402
		{
403
			messageList = this.messageList();
404
405
			if (messageList && 0 < messageList.length &&
406
				!!_.find(messageList, (item) => !!(item && item.deleted() && item.uid === this.messageListThreadUid())))
407
			{
408
				const message = _.find(messageList, (item) => item && !item.deleted());
409
				if (message && this.messageListThreadUid() !== pString(message.uid))
410
				{
411
					this.messageListThreadUid(pString(message.uid));
412
413
					setHash(mailBox(
414
						FolderStore.currentFolderFullNameHash(),
415
						this.messageListPage(),
416
						this.messageListSearch(),
417
						this.messageListThreadUid()
418
					), true, true);
419
				}
420
				else if (!message)
421
				{
422
					if (1 < this.messageListPage())
423
					{
424
						this.messageListPage(this.messageListPage() - 1);
425
426
						setHash(mailBox(
427
							FolderStore.currentFolderFullNameHash(),
428
							this.messageListPage(),
429
							this.messageListSearch(),
430
							this.messageListThreadUid()
431
						), true, true);
432
					}
433
					else
434
					{
435
						this.messageListThreadUid('');
436
437
						setHash(mailBox(
438
							FolderStore.currentFolderFullNameHash(),
439
							this.messageListPageBeforeThread(),
440
							this.messageListSearch()
441
						), true, true);
442
					}
443
				}
444
			}
445
		}
446
	}
447
448
	/**
449
	 * @param {Object} messageTextBody
450
	 */
451
	initBlockquoteSwitcher(messageTextBody) {
452
		if (messageTextBody)
453
		{
454
			const $oList = $('blockquote:not(.rl-bq-switcher)', messageTextBody).filter(function() {
455
				return 0 === $(this).parent().closest('blockquote', messageTextBody).length; // eslint-disable-line no-invalid-this
456
			});
457
458
			if ($oList && 0 < $oList.length)
459
			{
460
				$oList.each(function() {
461
					const $this = $(this); // eslint-disable-line no-invalid-this
462
					if ('' !== trim($this.text()))
463
					{
464
						$this.addClass('rl-bq-switcher hidden-bq');
465
						$('<span class="rlBlockquoteSwitcher"><i class="icon-ellipsis" /></span>')
466
							.insertBefore($this)
467
							.on('click.rlBlockquoteSwitcher', () => {
468
								$this.toggleClass('hidden-bq');
469
								windowResize();
470
							})
471
							.after('<br />')
472
							.before('<br />');
473
					}
474
				});
475
			}
476
		}
477
	}
478
479
	/**
480
	 * @param {Object} oMessageTextBody
481
	 */
482
	initOpenPgpControls(oMessageTextBody, oMessage) {
483
		if (oMessageTextBody && oMessageTextBody.find)
484
		{
485
			oMessageTextBody.find('.b-plain-openpgp:not(.inited)').each(function() {
486
				PgpStore.initMessageBodyControls($(this), oMessage); // eslint-disable-line no-invalid-this
487
			});
488
		}
489
	}
490
491
	setMessage(data, cached) {
492
493
		let
494
			isNew = false,
495
			body = null,
496
			id = '',
497
			plain = '',
498
			resultHtml = '',
499
			pgpSigned = false,
500
			messagesDom = this.messagesBodiesDom(),
501
			selectedMessage = this.selectorMessageSelected(),
502
			message = this.message();
503
504
		if (data && message && data.Result && 'Object/Message' === data.Result['@Object'] &&
505
			message.folderFullNameRaw === data.Result.Folder)
506
		{
507
			const threads = message.threads();
508
			if (message.uid !== data.Result.Uid && 1 < threads.length && -1 < inArray(data.Result.Uid, threads))
509
			{
510
				message = MessageModel.newInstanceFromJson(data.Result);
511
				if (message)
512
				{
513
					message.threads(threads);
514
					initMessageFlagsFromCache(message);
515
516
					this.message(this.staticMessage.populateByMessageListItem(message));
517
					message = this.message();
518
519
					isNew = true;
520
				}
521
			}
522
523
			if (message && message.uid === data.Result.Uid)
524
			{
525
				this.messageError('');
526
527
				message.initUpdateByMessageJson(data.Result);
528
				addRequestedMessage(message.folderFullNameRaw, message.uid);
529
530
				if (!cached)
531
				{
532
					message.initFlagsByJson(data.Result);
533
				}
534
535
				messagesDom = messagesDom && messagesDom[0] ? messagesDom : null;
536
				if (messagesDom)
537
				{
538
					id = 'rl-mgs-' + message.hash.replace(/[^a-zA-Z0-9]/g, '');
539
540
					const textBody = messagesDom.find('#' + id);
541
					if (!textBody || !textBody[0])
542
					{
543
						let isHtml = false;
0 ignored issues
show
Unused Code introduced by
The assignment to variable isHtml seems to be never used. Consider removing it.
Loading history...
544
						if (isNormal(data.Result.Html) && '' !== data.Result.Html)
545
						{
546
							isHtml = true;
547
							resultHtml = data.Result.Html.toString();
548
						}
549
						else if (isNormal(data.Result.Plain) && '' !== data.Result.Plain)
550
						{
551
							isHtml = false;
552
							resultHtml = plainToHtml(data.Result.Plain.toString(), false);
553
554
							if ((message.isPgpSigned() || message.isPgpEncrypted()) && require('Stores/User/Pgp').capaOpenPGP())
555
							{
556
								plain = pString(data.Result.Plain);
557
558
								const isPgpEncrypted = (/---BEGIN PGP MESSAGE---/).test(plain);
559
								if (!isPgpEncrypted)
560
								{
561
									pgpSigned = (/-----BEGIN PGP SIGNED MESSAGE-----/).test(plain) &&
562
										(/-----BEGIN PGP SIGNATURE-----/).test(plain);
563
								}
564
565
								$div.empty();
566
								if (pgpSigned && message.isPgpSigned())
567
								{
568
									resultHtml = $div.append(
569
										$('<pre class="b-plain-openpgp signed"></pre>').text(plain)
570
									).html();
571
								}
572
								else if (isPgpEncrypted && message.isPgpEncrypted())
573
								{
574
									resultHtml = $div.append(
575
										$('<pre class="b-plain-openpgp encrypted"></pre>').text(plain)
576
									).html();
577
								}
578
								else
579
								{
580
									resultHtml = '<pre>' + resultHtml + '</pre>';
581
								}
582
583
								$div.empty();
584
585
								message.isPgpSigned(pgpSigned);
586
								message.isPgpEncrypted(isPgpEncrypted);
587
							}
588
							else
589
							{
590
								resultHtml = '<pre>' + resultHtml + '</pre>';
591
							}
592
						}
593
						else
594
						{
595
							isHtml = false;
596
							resultHtml = '<pre>' + resultHtml + '</pre>';
597
						}
598
599
						GlobalsData.iMessageBodyCacheCount += 1;
600
601
						body = $('<div id="' + id + '" ></div>').hide().addClass('rl-cache-class');
602
						body.data('rl-cache-count', GlobalsData.iMessageBodyCacheCount);
603
604
						body
605
							.html(findEmailAndLinks(resultHtml))
606
							.addClass('b-text-part ' + (isHtml ? 'html' : 'plain'));
607
608
						message.isHtml(!!isHtml);
609
						message.hasImages(!!data.Result.HasExternals);
610
611
						message.body = body;
612
						if (message.body)
613
						{
614
							messagesDom.append(message.body);
615
						}
616
617
						message.storeDataInDom();
618
619
						if (data.Result.HasInternals)
620
						{
621
							message.showInternalImages(true);
622
						}
623
624
						if (message.hasImages() && SettingsStore.showImages())
625
						{
626
							message.showExternalImages(true);
627
						}
628
629
						this.purgeMessageBodyCacheThrottle();
630
					}
631
					else
632
					{
633
						message.body = textBody;
634
						if (message.body)
635
						{
636
							GlobalsData.iMessageBodyCacheCount += 1;
637
							message.body.data('rl-cache-count', GlobalsData.iMessageBodyCacheCount);
638
							message.fetchDataFromDom();
639
						}
640
					}
641
642
					this.messageActiveDom(message.body);
643
644
					this.hideMessageBodies();
645
646
					if (body)
647
					{
648
						this.initOpenPgpControls(body, message);
649
650
						this.initBlockquoteSwitcher(body);
651
					}
652
653
					message.body.show();
654
				}
655
656
				initMessageFlagsFromCache(message);
657
				if (message.unseen() || message.hasUnseenSubMessage())
658
				{
659
					getApp().messageListAction(
660
						message.folderFullNameRaw, message.uid, MessageSetAction.SetSeen, [message]);
661
				}
662
663
				if (isNew)
664
				{
665
					message = this.message();
666
667
					if (selectedMessage && message && (
668
						message.folderFullNameRaw !== selectedMessage.folderFullNameRaw ||
669
						message.uid !== selectedMessage.uid
670
					))
671
					{
672
						this.selectorMessageSelected(null);
673
						if (1 === this.messageList().length)
674
						{
675
							this.selectorMessageFocused(null);
676
						}
677
					}
678
					else if (!selectedMessage && message)
679
					{
680
						selectedMessage = _.find(this.messageList(),
681
							(subMessage) => subMessage &&
682
								subMessage.folderFullNameRaw === message.folderFullNameRaw &&
683
								subMessage.uid === message.uid
684
						);
685
686
						if (selectedMessage)
687
						{
688
							this.selectorMessageSelected(selectedMessage);
689
							this.selectorMessageFocused(selectedMessage);
690
						}
691
					}
692
693
				}
694
695
				windowResize();
696
			}
697
		}
698
	}
699
700
	selectMessage(oMessage) {
701
		if (oMessage)
702
		{
703
			this.message(this.staticMessage.populateByMessageListItem(oMessage));
704
			this.populateMessageBody(this.message());
705
		}
706
		else
707
		{
708
			this.message(null);
709
		}
710
	}
711
712
	selectMessageByFolderAndUid(sFolder, sUid) {
713
		if (sFolder && sUid)
714
		{
715
			this.message(this.staticMessage.populateByMessageListItem(null));
716
			this.message().folderFullNameRaw = sFolder;
717
			this.message().uid = sUid;
718
719
			this.populateMessageBody(this.message());
720
		}
721
		else
722
		{
723
			this.message(null);
724
		}
725
	}
726
727
	populateMessageBody(oMessage) {
728
		if (oMessage)
729
		{
730
			if (Remote.message(this.onMessageResponse, oMessage.folderFullNameRaw, oMessage.uid))
731
			{
732
				this.messageCurrentLoading(true);
733
			}
734
		}
735
	}
736
737
	/**
738
	 * @param {string} sResult
739
	 * @param {AjaxJsonDefaultResponse} oData
740
	 * @param {boolean} bCached
741
	 */
742
	onMessageResponse(sResult, oData, bCached) {
743
744
		this.hideMessageBodies();
745
746
		this.messageCurrentLoading(false);
747
748
		if (StorageResultType.Success === sResult && oData && oData.Result)
749
		{
750
			this.setMessage(oData, bCached);
751
		}
752
		else if (StorageResultType.Unload === sResult)
753
		{
754
			this.message(null);
755
			this.messageError('');
756
		}
757
		else if (StorageResultType.Abort !== sResult)
758
		{
759
			this.message(null);
760
			this.messageError((oData && oData.ErrorCode ?
761
				getNotification(oData.ErrorCode) : getNotification(Notification.UnknownError)));
762
		}
763
	}
764
765
	/**
766
	 * @param {Array} aList
0 ignored issues
show
Documentation introduced by
The parameter aList does not exist. Did you maybe forget to remove this comment?
Loading history...
767
	 * @returns {string}
768
	 */
769
	calculateMessageListHash(list) {
770
		return _.map(list, (message) => '' + message.hash + '_' + message.threadsLen() + '_' + message.flagHash()).join('|');
771
	}
772
773
	setMessageList(data, cached) {
774
		if (data && data.Result && 'Collection/MessageCollection' === data.Result['@Object'] &&
775
			data.Result['@Collection'] && isArray(data.Result['@Collection']))
776
		{
777
			let
778
				newCount = 0,
779
				unreadCountChange = false;
780
781
			const
782
				list = [],
783
				utc = require('Common/Momentor').momentNowUnix(),
784
				iCount = pInt(data.Result.MessageResultCount),
785
				iOffset = pInt(data.Result.Offset);
786
787
			const folder = getFolderFromCacheList(isNormal(data.Result.Folder) ? data.Result.Folder : '');
788
789
			if (folder && !cached)
790
			{
791
				folder.interval = utc;
792
793
				setFolderHash(data.Result.Folder, data.Result.FolderHash);
794
795
				if (isNormal(data.Result.MessageCount))
796
				{
797
					folder.messageCountAll(data.Result.MessageCount);
798
				}
799
800
				if (isNormal(data.Result.MessageUnseenCount))
801
				{
802
					if (pInt(folder.messageCountUnread()) !== pInt(data.Result.MessageUnseenCount))
803
					{
804
						unreadCountChange = true;
805
					}
806
807
					folder.messageCountUnread(data.Result.MessageUnseenCount);
808
				}
809
810
				this.initUidNextAndNewMessages(folder.fullNameRaw, data.Result.UidNext, data.Result.NewMessages);
811
			}
812
813
			if (unreadCountChange && folder)
814
			{
815
				clearMessageFlagsFromCacheByFolder(folder.fullNameRaw);
816
			}
817
818
			_.each(data.Result['@Collection'], (jsonMessage) => {
819
				if (jsonMessage && 'Object/Message' === jsonMessage['@Object'])
820
				{
821
					const message = MessageModel.newInstanceFromJson(jsonMessage);
822
					if (message)
823
					{
824
						if (hasNewMessageAndRemoveFromCache(message.folderFullNameRaw, message.uid) && 5 >= newCount)
825
						{
826
							newCount += 1;
827
							message.newForAnimation(true);
828
						}
829
830
						message.deleted(false);
831
832
						if (cached)
833
						{
834
							initMessageFlagsFromCache(message);
835
						}
836
						else
837
						{
838
							storeMessageFlagsToCache(message);
839
						}
840
841
						list.push(message);
842
					}
843
				}
844
			});
845
846
			this.messageListCount(iCount);
847
			this.messageListSearch(isNormal(data.Result.Search) ? data.Result.Search : '');
848
			this.messageListPage(window.Math.ceil((iOffset / SettingsStore.messagesPerPage()) + 1));
849
			this.messageListThreadUid(isNormal(data.Result.ThreadUid) ? pString(data.Result.ThreadUid) : '');
850
851
			this.messageListEndFolder(isNormal(data.Result.Folder) ? data.Result.Folder : '');
852
			this.messageListEndSearch(this.messageListSearch());
853
			this.messageListEndThreadUid(this.messageListThreadUid());
854
			this.messageListEndPage(this.messageListPage());
855
856
			this.messageListDisableAutoSelect(true);
857
858
			this.messageList(list);
859
			this.messageListIsNotCompleted(false);
860
861
			clearNewMessageCache();
862
863
			if (folder && (cached || unreadCountChange || SettingsStore.useThreads()))
864
			{
865
				getApp().folderInformation(folder.fullNameRaw, list);
866
			}
867
		}
868
		else
869
		{
870
			this.messageListCount(0);
871
			this.messageList([]);
872
			this.messageListError(getNotification(
873
				data && data.ErrorCode ? data.ErrorCode : Notification.CantGetMessageList
874
			));
875
		}
876
	}
877
}
878
879
module.exports = new MessageUserStore();
880